import { IllegalArgumentsException } from '../types/exceptions.js';

/**
 * 通用验证工具类
 */
export class ValidationUtil {
  /**
   * 验证ID参数
   * @param id ID字符串或数字
   * @param fieldName 字段名称，用于错误提示
   * @returns 验证后的数字ID
   * @throws IllegalArgumentsException 当ID无效时
   */
  static validateId(id: string | number, fieldName: string = 'ID'): number {
    const numId = typeof id === 'string' ? parseInt(id) : id;
    if (isNaN(numId) || numId <= 0) {
      throw new IllegalArgumentsException(`${fieldName}必须是大于0的数字`);
    }
    return numId;
  }

  /**
   * 验证分页参数
   * @param page 页码
   * @param pageSize 每页数量
   * @param maxPageSize 最大每页数量，默认100
   * @returns 验证后的分页参数
   * @throws IllegalArgumentsException 当分页参数无效时
   */
  static validatePagination(
    page: string | number | undefined,
    pageSize: string | number | undefined,
    maxPageSize: number = 100
  ): { pageNum: number; pageSizeNum: number } {
    const pageNum = typeof page === 'string' ? parseInt(page) : page || 1;
    const pageSizeNum = typeof pageSize === 'string' ? parseInt(pageSize) : pageSize || 10;

    if (isNaN(pageNum) || pageNum < 1) {
      throw new IllegalArgumentsException('页码必须是大于0的数字');
    }
    if (isNaN(pageSizeNum) || pageSizeNum < 1 || pageSizeNum > maxPageSize) {
      throw new IllegalArgumentsException(`每页数量必须是1-${maxPageSize}之间的数字`);
    }

    return { pageNum, pageSizeNum };
  }

  /**
   * 验证必填字符串参数
   * @param value 待验证的值
   * @param fieldName 字段名称
   * @throws IllegalArgumentsException 当字符串为空时
   */
  static validateRequiredString(value: string | undefined | null, fieldName: string): void {
    if (!value || !value.trim()) {
      throw new IllegalArgumentsException(`${fieldName}不能为空`);
    }
  }

  /**
   * 验证邮箱格式
   * @param email 邮箱地址
   * @param fieldName 字段名称，默认为'邮箱'
   * @throws IllegalArgumentsException 当邮箱格式无效时
   */
  static validateEmail(email: string, fieldName: string = '邮箱'): void {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      throw new IllegalArgumentsException(`${fieldName}格式不正确`);
    }
  }

  /**
   * 验证手机号格式（中国大陆）
   * @param phone 手机号
   * @param fieldName 字段名称，默认为'手机号'
   * @throws IllegalArgumentsException 当手机号格式无效时
   */
  static validatePhone(phone: string, fieldName: string = '手机号'): void {
    const phoneRegex = /^1[3-9]\d{9}$/;
    if (!phoneRegex.test(phone)) {
      throw new IllegalArgumentsException(`${fieldName}格式不正确`);
    }
  }

  /**
   * 验证数值范围
   * @param value 待验证的数值
   * @param min 最小值
   * @param max 最大值
   * @param fieldName 字段名称
   * @throws IllegalArgumentsException 当数值超出范围时
   */
  static validateRange(value: number, min: number, max: number, fieldName: string): void {
    if (value < min || value > max) {
      throw new IllegalArgumentsException(`${fieldName}必须在${min}-${max}之间`);
    }
  }

  /**
   * 验证字符串长度
   * @param value 待验证的字符串
   * @param minLength 最小长度
   * @param maxLength 最大长度
   * @param fieldName 字段名称
   * @throws IllegalArgumentsException 当字符串长度不符合要求时
   */
  static validateStringLength(
    value: string,
    minLength: number,
    maxLength: number,
    fieldName: string
  ): void {
    if (value.length < minLength || value.length > maxLength) {
      throw new IllegalArgumentsException(`${fieldName}长度必须在${minLength}-${maxLength}之间`);
    }
  }
}
